#pragma once
#include "MyGlut.h"
#include "Model.h"

using namespace glut;

class View {
private:
	/*attributs pour les display list des viewport top et bottom*/
	int dlFond;
	int dlViesPacman;
	int dlResetButton;
	int dlQuitButton;
	int dlUpArrow;
	int dlDownArrow;
	int dlLeftArrow;
	int dlRightArrow;
	/*attributs représentant les display lists de la viewport du milieu*/
	int dlBiere;
	int dlJackie;
	int dlGhost; //etat 1 du ghost(phare bleu)
	int dlGhost2; //etat 2 du ghost(phare rouge)
	int dlGhost3; //etat 3 du ghost(phare vert)
	int dlMurInt;
	int dlMurExtH;
	int dlMurExtV;
	int dlCoinExt;
	int dlMurPrison;
	int dlMiddlePoint;

	int* tabViewportMid;
	int* tabViewportBot;

	//méthodes
	void distortionTop(float w, float h); // gère la distortion de la viewport1
	void distortionBottom(float w, float h); // gère la distortion de la viewport3
	void ecrire(string text); //permet d'écrire un texte donné en paramètre

protected:
	GLUquadricObj *quadDisque; // Pour dessiner le PacMan et les vies restantes

	float d1, d2, delta1, delta2;
	static float h_global, w_global; // Pour stocker hauteur et largeur de la fenêtre d'écran, static car doit être même valeurs pr tt les enfants
	Model *model; // Instance du Model pour accèder aux données modifiables
	float tempAngleDebut;
	float tempAngleEntier;
	float smoothlag;

	void flechesDirection(); // Dessine les flèches de direction
	void popUp(string m);
	void boutonReset(); // Dessine le bouton "Reset"
	void boutonQuit(); // Dessine le bouton "Quit"
	void viewportTop(); //infos jeu(vies,etc..)
	void viewportBottom(); //boutons + touches directionnelles
	void applySmoothMoves(Mouvable, float);
	void initDisplayList(); //initialise les display lists
	void dessineFond(); // Dessine un rectangle pour donner une couleur de fond au deux petites viewport

	virtual void dessinePacman() = 0; // Dessine le PacMan
	virtual void dessineBiere() = 0; // Dessine une bière
	virtual void dessineJackie() = 0; // Dessine la bouteille de Whiskey, Jackie comme "Jack Daniels"
	virtual void dessineGhost(float, float, float) = 0; // Dessine la voiture de police dans l'état 1
	virtual void dessineMurInterieur() = 0; //dessine un mur intérieur
	virtual void dessineMurExHor() = 0; //dessine un mur extérieur horizontal
	virtual void dessineMurExVert() = 0; //dessine un mur extérieur vertical
	virtual void dessineCoinExt(int i = 0, int j = 0) = 0; //dessiner un coin de mur extérieur(param par défault car il n'est pas tjr nécessaire de les préciser)
	virtual void dessineMurPrison() = 0; //dessine un mur de prison
	virtual void viewPortMiddle() = 0; //view contenant le jeu
	virtual void applySmoothPacmanAnimation(float) = 0;
	virtual ~View();
	View();

public:
	void reshape(float w, float h); // Appel en cas de redimensionnement de la fenêtre d'écran
	void redraw(); // Rafraichit l'affichage
	void display(); // Définit les formes dans l'univers de dessin
	void dessineJeu(); // dessine tout ce qui est lié au jeu, fera donc appel aux méthodes de dessin
	virtual void dessineMiddlePoint() = 0; //dessine un point au centre du plateau permettant de faire une rotation sur le plateau
	virtual void gererProjection() = 0; //gère la projection(zoom, pas zoom, ..)
	virtual void gererLookAt() = 0; //gère le glutLookAt(mode première personne ou pas, ...)
	float getSmoothlag() const;
	void setSmoothlag(float smoothlag);
	float getH_global() {
		return h_global;
	}

	float getW_global() {
		return w_global;
	}
};
